package com.tarena.csmall.seckill.checker;

import cn.tedu.mall.common.exception.CoolSharkServiceException;
import cn.tedu.mall.common.restful.ResponseCode;
import cn.tedu.mall.pojo.seckill.dto.SeckillOrderAddDTO;
import cn.tedu.mall.pojo.seckill.vo.SeckillSpuVO;
import com.alibaba.fastjson.JSON;
import com.tarena.csmall.seckill.service.SeckillSkuService;
import com.tarena.csmall.seckill.service.SeckillSpuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

@Component
@Order(100)
public class ReSeckillChecker implements SeckillCommitChecker{
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Override public void check(SeckillOrderAddDTO dto, String randCode) {
        ValueOperations<String, String> opsForValue = stringRedisTemplate.opsForValue();
        //UNDO 1. 验证 商品是否存在 skuId是否是秒杀商品之一 布隆
        //2. 验证 同一个用户userId 是否 购买 秒杀了同一个商品2次
        //使用userId+":"+skuId 在redis做incr操作 如果是第一次购买 返回值是1 不是第一次购买返回值>1
        Long userId=dto.getUserId();
        Long skuId=dto.getSeckillOrderItemAddDTO().getSkuId();
        String reseckillKey=userId+":"+skuId;
        Long increment = opsForValue.increment(reseckillKey, 1);
        if(increment>1){
            //同一个用户 秒杀了同一个商品2次
            throw new CoolSharkServiceException(ResponseCode.BAD_REQUEST,"同一个用户禁止秒杀同一个商品2次");
        }
    }
}
